{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "module_path = os.path.abspath(os.path.join('..'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# test homography with size(240, 360)\n",
    "\n",
    "import cv2\n",
    "batch_size = 10\n",
    "def loadConfig(filename):\n",
    "    import yaml\n",
    "    with open(filename, 'r') as f:\n",
    "        config = yaml.load(f)\n",
    "    return config\n",
    "test_tf = False\n",
    "test_corner_def = True\n",
    "\n",
    "def scale_homography(H, shape, shift=(-1,-1)):\n",
    "    height, width = shape[0], shape[1]\n",
    "    trans = np.array([[2./width, 0., shift[0]], [0., 2./height, shift[1]], [0., 0., 1.]])\n",
    "    H_tf = np.linalg.inv(trans) @ H @ trans\n",
    "    return H_tf\n",
    "\n",
    "def sample_homography_batches(config, batch_size=1, shape=np.array([1,1]), tf=False):\n",
    "    offset = 0\n",
    "    b = 2\n",
    "\n",
    "    if tf:\n",
    "        from utils.homographies import sample_homography as sample_homography\n",
    "#         shape = np.array([b, b])\n",
    "        mat_homographies = [sample_homography(shape,\n",
    "                                          **config['data']['augmentation']['homographic']['params']) for i in range(batch_size)]\n",
    "        \n",
    "#         mat_homographies = [scale_homography(sample_homography(shape,\n",
    "#                                           **config['data']['warped_pair']['params']), shape)\n",
    "#                                             for i in range(batch_size)]\n",
    "    else:\n",
    "        from utils.homographies import sample_homography_np as sample_homography\n",
    "        mat_homographies = [sample_homography(shape, shift=-1 + offset,\n",
    "                                          **config['data']['augmentation']['homographic']['params']) for i in range(batch_size)]\n",
    "    \n",
    "    mat_homographies = np.stack(mat_homographies, axis=0)\n",
    "    return mat_homographies\n",
    "\n",
    "\n",
    "\n",
    "def drawBox(points, img, offset=np.array([0,0]), color=(0,255,0)):\n",
    "#     print(\"origin\", points)\n",
    "    offset = offset[::-1]\n",
    "    points = points + offset    \n",
    "    points = points.astype(int)\n",
    "    for i in range(len(points)):\n",
    "        img = img + cv2.line(np.zeros_like(img),tuple(points[-1+i]), tuple(points[i]), color,5)\n",
    "    return img\n",
    "\n",
    "# load config\n",
    "filename = '../configs/config_test.yaml'\n",
    "config = loadConfig(filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def warp_points_np(points, homographies, device='cpu'):\n",
    "    \"\"\"\n",
    "    Warp a list of points with the given homography.\n",
    "\n",
    "    Arguments:\n",
    "        points: list of N points, shape (N, 2).\n",
    "        homography: batched or not (shapes (B, 3, 3) and (...) respectively).\n",
    "\n",
    "    Returns: a Tensor of shape (N, 2) or (B, N, 2) (depending on whether the homography\n",
    "            is batched) containing the new coordinates of the warped points.\n",
    "    \"\"\"\n",
    "    # expand points len to (x, y, 1)\n",
    "    batch_size = homographies.shape[0]\n",
    "    points = np.concatenate((points, np.ones((points.shape[0], 1))), axis=1)\n",
    "    # points = points.to(device)\n",
    "    # homographies = homographies.(batch_size*3,3)\n",
    "    # warped_points = homographies*points\n",
    "    # warped_points = homographies@points.transpose(0,1)\n",
    "    warped_points = np.tensordot(homographies, points.transpose(), axes=([2], [0]))\n",
    "    # normalize the points\n",
    "    warped_points = warped_points.reshape([batch_size, 3, -1])\n",
    "    warped_points = warped_points.transpose([0, 2, 1])\n",
    "    warped_points = warped_points[:, :, :2] / warped_points[:, :, 2:]\n",
    "    return warped_points"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### homography visualization for my inplementation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "homography visualization for my inplementation\n",
      "print forward homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "print inverse homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# homography visualization for my inplementation\n",
    "print(\"homography visualization for my inplementation\")\n",
    "\n",
    "\n",
    "from numpy.linalg import inv\n",
    "\n",
    "# sample homography\n",
    "batch_size = 200\n",
    "shape = np.array([2,2])\n",
    "homographies = sample_homography_batches(config, batch_size, shape=shape, tf=False)\n",
    "\n",
    "# change shapes\n",
    "height, width = 240, 320\n",
    "image_shape = np.array([height, width])\n",
    "homographies = np.stack([scale_homography(H, image_shape, shift=(-1,-1)) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "print(\"print forward homographies\")\n",
    "plt.imshow(img)\n",
    "plt.show()\n",
    "\n",
    "#  inv_homography\n",
    "inv_homographies = np.stack([inv(H) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, inv_homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "    \n",
    "print(\"print inverse homographies\")\n",
    "plt.imshow(img)\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### homography visualization for tensorflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "homography visualization for tensorflow\n",
      "print forward homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAD8CAYAAADzEfagAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHQNJREFUeJzt3X/MZFV9x/H3d3cFW21ZQLuhu2vBuNGQJiLd2CWaxkptgRqXPwiBmLAhm+w/ttVqYpf2j8akf9SkESU2pBvRLsaqlGp3Q4yWLiTtPyC7YlFZkAeV7m6AVYG1SlIL++0fcy579jzn3HvPPPM8M3Pn80omc+fcOzN3Zp75POfXvWPujoiI9LNu2jsgIjJPFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFVYlNM3sKjN73MyWzGzvajyHiMg02KTnaZrZeuD7wHuA48BDwI3u/uhEn0hEZApWo6b5dmDJ3X/g7r8EvgTsXIXnERFZcxtW4TE3A8ei28eB3227g5npsCQRmbafuPvruzZajdDsxcz2AHum9fwiIomn+my0GqF5Atga3d4Sys7i7vuAfaCapojMj9Xo03wI2GZml5jZOcANwMFVeB4RkTU38Zqmu79kZn8CfANYD3zW3b836ecREZmGiU85Gmsn1DwXkek74u7buzbSEUEiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVOkPTzD5rZifN7LtR2QVmdq+ZPRGuzw/lZma3mdmSmT1iZpev5s6LiKy1PjXNfwSuSsr2AofcfRtwKNwGuBrYFi57gNsns5siIrOhMzTd/T+A55LincD+sLwfuDYqv9NHHgA2mtlFk9pZEZFpG7dPc5O7Px2WnwE2heXNwLFou+OhTERkEDas9AHc3c3Ma+9nZnsYNeFFRObGuDXNZ5tmd7g+GcpPAFuj7baEsmXcfZ+7b3f37WPug4jImhs3NA8Cu8LyLuBAVH5TGEXfAZyKmvEiInOvs3luZl8E3gW8zsyOA38N/C1wl5ntBp4Crg+bfw24BlgCXgRuXoV9FhGZGnOv7o6c/E6M0ScqIjJhR/p0F+qIIBGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCgpNEZEKCk0RkQoKTRGRCp2haWZbzex+M3vUzL5nZh8M5ReY2b1m9kS4Pj+Um5ndZmZLZvaImV2+2i9CRGSt9KlpvgR8xN0vBXYAHzCzS4G9wCF33wYcCrcBrga2hcse4PaJ77VI6nS4iKyyztB096fd/Vth+X+Ao8BmYCewP2y2H7g2LO8E7vSRB4CNZnbRxPdcpOGFZZFVUNWnaWYXA28DHgQ2ufvTYdUzwKawvBk4Ft3teChLH2uPmR02s8OV+yxyRhOSFi5NmcJTVknv0DSz1wL/AnzI3X8Wr3P36j9Td9/n7tvdfXvN/UReEf/FxaGZWy8yIb1C08xexSgwv+DuXwnFzzbN7nB9MpSfALZGd98SymTRnGZtgsuS5bjG+TLq65SJ6jN6bsAdwFF3/0S06iCwKyzvAg5E5TeFUfQdwKmoGS+LIu1njC+TfPy0dpk+d98me7x/GlSSFjZqWbdsYPZO4D+B73DmT+kvGfVr3gW8AXgKuN7dnwsh+2ngKuBF4GZ3b+23NDM1pIYmDrW2TzcXen0fO3f/0nN5tK2Nsa0sgiN9ugs7Q3MtKDQHpm8tMNUnoEqBmT5ubt3pZF36fKXHU3Auil6hqSOCZG3lBmwaNU342sB08rVSI79PCkop2DDtHZCBaatlxrqa1bkgTB+7tE0udHNNcyMfpqk+28jCUGjKbGirOcLykXhPrkt9p6UuAkuuc9vG6xScEqh5LpMzqZ7ptMmc9i8204icctO6rRsgrnV2HU2koJSEQlMmbzWDJp0K1DXBvaQ0kt4WnDrSSFDzXFg+qDyWvn2ZtY+X67dsLm39oLnDK1Np07yrub6KHNVg5oVCU2ZHLgSbsiZR0qN/0vuW+j27muq5gaF0vuYq9W+q23S+KDRl5fO4x6mZdTVz05pin9H4NHXi0fS4Op17rDQUG6eTx8kF6gqpxT9fFJqydrrSoQmh00lZnylBuceJ16eHScbbemY7OFO7Lf1T6DtdqblW+3sQFJqyMn1rjCWlgIN+IVM79agJzdLIfNvczdOZ9TXVxNMoOAdAoSmT0TdE2o4Giq/7PF46ml2a69k1rShVaoLnArWmma4Oy0FQaMrKtE3VgfYjf+LQi+ddkpSVnjN+jrYTg5QGj9Ky3Eh6uo2xfLpBUwNtq0Wq43IwFJpSL+0jtMxtODtg4vuWlnMjUm39iG3N5K6gTO+TbnM62aYU3qo9LhyF5iKL+/b6bJsup6HTNm8yVarJrcuUNdunj1eq2dU0l9P5PqW5nrnXVjqeXQZNobmoSke35JrJqTgs4u3WJ+vbmta5+Y/p/XJBHW9X0hbWuX1r6yJoXuM6zn7P0ulMfY9GUrDOPYXmosodDROvS7/Yaa2uFHR9m9bN+twZ0kuHLfYNppw0iNua28112u0AZ8IzvU+zHNfeFY6DpNBcZLn+ulItMne/0u2u5yrNx0zF+zDOxPmakfJmObefXY8dh388rSjXn6sgnXsKzUXRZxQa6kIq3aZtzmVce0ufu1SLLT1uabu2/RsndHOPkRthbyaup4Ni8etKB88mQQE8FQrNIesbKuNM1E6fIw2DtjmUuX7M9PHS+9Xs20rDJH3O0sh+vC5tlseXvu9LjaYrQJPl15xCc2hqal8rCclmORd+Xf2QpefN9RXWNrEnKW2u55rXpRpn7j6lfxR0lMdK77msGYXmEHRNHeoz2tx3RDo3eJROuWlr4pdqWfFE9q4Bn7UMi3QwqBSc6QBTqX+01EWR3m4LVoXmVPX53fNXm9k3zey/zOx7ZvaxUH6JmT1oZktm9mUzOyeUnxtuL4X1F6/uSxBgeeDEl5JSqOUufZ6jqw8x93jpb4znpvv0fT2rJa1Fl/qC0z7MNDhJltteV/xenU7K032SNdWnR+R/gXe7+1uBy4CrzGwH8HHgVnd/E/A8sDtsvxt4PpTfGraT1bTSqTh9Bii6+uly+1IK31xNqwmdaYZjm2bfGqX3Kv5G5VoAfd/jPtvLVHSGpo/8PNx8Vbg48G7g7lC+H7g2LO8MtwnrrzSzWfsKDEvfd7cUYrnH6xOSpRH53GPnmp7NY6eBNMv61DrjEyb3nbVQep5cgM7LezVQvcbezGy9mX0bOAncCzwJvODuL4VNjgObw/Jm4BhAWH8KuDDzmHvM7LCZHV7ZSxCgfZS5dOKL5n61Tfq4SV0zQp8L4HkKgNK+5vo5c9ON0vv0rUWmE+plqnqFpru/7O6XAVuAtwNvWekTu/s+d9/u7ttX+liSaKvdlMKxbUS7Cd20f615vHi5rYaamqfATJXev7aZA7lw7TOTIH1emaqqWV7u/gJwP3AFsNHMmtH3LcCJsHwC2AoQ1p8H/HQieyvtSiFY00fY1XyPw3fcPshZ7LOs1TXVKl5XGkkv3S99DNUyZ0qf0fPXm9nGsPwrwHuAo4zC87qw2S7gQFg+GG4T1t/n7vrY10pXH1jpix2vL430Ntfr6X9W9fTx5j0sc/ufG/xKt4+b2Lmf/yzNUuh6bllzfeZpXgTsN7Pmq3KXu99jZo8CXzKzvwEeBu4I298BfN7MloDngBtWYb+lTa520rfG0lYLrPnSpqPlQ/zCp7XGUo2yKU+DM52W1JSnz9E8hswEm4VKoJlNfyeGplS7y3wJmz+Bs76XbTXSri/w0AOz670lsz4XjKG27tE2r3wTun7UTVbDkT5jLDpydaja+jfTsljaNE8nbXd9eWuO7JlXfYIyba7nBsxKfcfNulwzXqZOoTlkXV/utrmUcdOxb22nq7900bSNnKfvVel32dUGmzkKzaErDVyk0hpP1wTttvuntdMh6vsPoRScuZH13BFEGj2fOUP/0xbIN8mbsty8y5qjUNIm5lCb5H2Uuj665mrm7pO7n8wEheai6Zp7mbvddb9FDcyu/uF029Jk+LbBn7bpTDIVCs1FEX9h08Mq24KuFIS5yfOLFJjjSpvl6UBRnyOBFJxTpdBcJLn+sa6fmsit05f2jJraZnofWP5Llm3dIQrOmaDQXBSlqS/xdWn6S7y+NA1GtczxpNOP+m5PxX1kohSai6A0MJE2sbsO48tt27bdohknwNKzIfWV1lZlzSg0hyx3HPQ48wBL4drcXnS170F6pvr0d4Xi6y6qaa45heZQdU00z50sIg3E0txLNQvLut6XODDXJcvNP7T4VHxdz7MIc2JnjN7uoSnVLnNywZlOe0m3K91/0dW+F7lmeRycTXnXkVz6DNacQnNIJnEYY+5Qytw6HanSLvfe9D2WPPfPLPe4CsypUGgOxbiBmRsAyq2L6a8mr236Ue4XN+NR87bDK5tZCwrMmaA//3lX0xwvafrR4i9s12/cxOukXe6Y/rQ81nwOaR9yE64KzKlSaM6zSZyGrfmRtHhkvXRYZVymidZ5ufeszxSuXFlubq0G4aZOoTkU43yRamqouRNNqMazXPqelP6pdX1euZOg6IismdDn5y5kVqUj3aUz6OQ0NUxn9Js/jdwXM649tZ3tSCF6trQlkJML2XgmQ3x/heVMUE1zCMZpKqfny8x9ubumu6Tby0jbewrlf0i5+8Tr1yVlMhUKzaEY5yif3BezuX062a7PF1U1oeX6zJNNA5PMcvxZKTSnSqE5JDUnc0gnVKfrclNfSlNqNCh0trYmeem9zPUvp32aCsuZ0Ds0zWy9mT1sZveE25eY2YNmtmRmXzazc0L5ueH2Ulh/8ersuhR1jba2jYa3NSvT7dqec1HVjG639R/HywrLmVJT0/wgcDS6/XHgVnd/E/A8sDuU7waeD+W3hu1krbX1o5VCsWv0vE/ZIivNRsiFY1dgtpXJVPUKTTPbAvwx8Jlw24B3A3eHTfYD14blneE2Yf2VYXtZa6Xg7DMPM6dmJHhRA7U0YJO+981RPmS2bSuTqetb0/wk8FHOfMwXAi+4+0vh9nFgc1jeDBwDCOtPhe3PYmZ7zOywmR0ec9+lj7QvLP6ilgYemn7OtppRn2b6IskdDhm/N6ej9enP9ZZ+G0hmUmdomtl7gZPufmSST+zu+9x9u7tvn+TjSkHb/Mq0xlPqSysF5KIfYtn2jyMXnm0j4QrLmddncvs7gPeZ2TXAq4FfBz4FbDSzDaE2uQU4EbY/AWwFjpvZBuA84KcT33MZX1yzyc0DjOWmxeQmspdqWUOf9N71Opt/SmkNvZm43rdrRGZGZ03T3W9x9y3ufjFwA3Cfu78fuB+4Lmy2CzgQlg+G24T197n7otQ5Zl9ak0yb4KVPKh3YyJ3mbNECIBeY6ftxOrM+PtKnKVuE92sgVjJP8y+AD5vZEqM+yztC+R3AhaH8w8Dele2iTER6NvC2w/L6BGfzmND9hR/6v8zStK20Vp7rK1ZYzh2bhUqgmU1/J4YuDbjoC31WyzHtp8z9Wy31gbYdijm0cCjVMuOwPM2Z9y89jjy69ujxNM9kqo70GWPREUGLYh1nH/2TNsvjwybjGml68tvmsfoeAtg1WDSPSv2Y6XvVvE/xCVGgfQBoSO/TQOksR4uodPRPGnZdo759B4bayuZNqWldCtJc/6XMNYXmIss01c/68udCtNQXGjdFc88z1BpU/M8Elp+ZPf31ydI/GZkbCk0ZaZsE39ZHWQrTJjCGVNtMa96QP1Y8vT2vr1ey1KcpeenPycLy8PRom1xg5Po642k481T7bAvM9PW3NcfVdzn3VNOUsrj22HZ4ILRPbm/Kcs30XHjMWs2s1GUBy/+pxIE6TjCq+T7zFJrSLvflTY9mSa+bZnnbKHpbMLTNE52WdJ/WZ8pyR/6k702zHcDL5Nt6qoXONIWmlKU1zTQA0pHhUhM2/cXL0hE0ucfpU156nEmI9z3e75c5u9+XZP3pZLltZkJMHWYzT6Ep/eUGeyxZzoXBOs4ERxo0pefJaQvNSdZO4xrzy1F58zpKc11zZ8HP7Yea3nNNobnoapuCpeAsjaKn5WnzvKb/rqZWWlrf9XzpQFUThrC8xpmrLSscB0+hKfVK/XW5o4RyNbO0z3M1J3/nQjXXH5vb1jj7ePG06ZwObikkF4JCU/rJ1dDaap1wpineTHxPw6fp74zLJj0Iku5L25FPaVfD+uR2vE26LAtDoSntuqbOtI2Kl6Ye5abulEaS0+fps69d05hy4d8EeNplUKoFp+sVoAtDoSmTEze/U00gxaPRsHxwJa3t5R6/NEE8d3KRRhrIuWZ57kQkDR3dI4FCU0a6Bkfi67bHyDXX0+s0gHJTl3JH2PTpA80dnZQqPVeuT7Y04BM/joJ0oSg0pdykjdf3lTvypwnFNFziuZvxfsRN5fSxS32rZMpTbf2vpW6GrsCUhaPQXHTjTDnqu13cXO+ahpT7zZzc86UhG2urgbbVZEuj+7nHSamWuXAUmosu9PV1VTbHOkonXZ9rpp9OtltHvkaZC6euYCztX1vtMi4vDUxNuJapVv58UWhK/wzoTNaM9Jcv0zBsBoLgTJDmapJ9JsHH63OHOMbblZrjcXh3mXDKqcU/HxSasmwcJqvPIFDX+tLAUOkEIG3TmWr2tc8E91J/aemxJxiYpbnzMpsUmgL0yIBJfKPTwMytS+dzpsttoVUK9rQ5nv4eUjrwpHaytOj1VTCzH5nZd8zs22Z2OJRdYGb3mtkT4fr8UG5mdpuZLZnZI2Z2+Wq+AJkzuRH0dH2ur7Kr/7KmJhyHYxqUfaZeKVQXWk394ffd/bLoJy73AofcfRtwiDO/b341sC1c9gC3T2pnZSCaJnmjz++np1OAmrKu0fa4LJ5/Ge/HOpbvk0jBSv5MdgL7w/J+4Nqo/E4feQDYaGYXreB5ZKjS4GybgwlnN6c9ueTmh+bmgMbbdo3Ox1TLlKBvaDrwb2Z2xMz2hLJN7v50WH4G2BSWNwPHovseD2Uiy6XnoMwdDZTezo225+aCxvdJQ0/hJ2PqOxD0Tnc/YWa/AdxrZo/FK93dzaxqxkQI3z2dG8piKI2up+tz94sHdnLHmK80MFXLlEivmqa7nwjXJ4GvAm8Hnm2a3eH6ZNj8BLA1uvuWUJY+5j533x71kcqiisMsNyk9/e2duGmdjnqnU4lK9+tLkycl0RmaZvYaM/u1Zhn4Q+C7wEFgV9hsF3AgLB8Ebgqj6DuAU1EzXiQvVwuMm+Jp+MVluSb8y1H5OGFZ2j9ZeH2a55uAr5pZs/0/ufvXzewh4C4z2w08BVwftv8acA2wBLwI3DzxvZZhKs3HTJvdaYDmDp+MH3NcqmVKhrlP/y+jtj9UBiw3wT2d6E5mOZ1+NInpQ+rLXDRH+nQX6oggmS2lgIp/7Gx9sq5vyNZQYEqBQlPmQ3yAfNyHmbZRSr/FrvCTCdExEDI/SoNE6frSoZh9KWilhWqaMl/Sk27EZaVt+5zsg2QbkQLVNGU+xT8D3GWcWqdqmVKg0JT5VfPX2+dkHyI9KDRlsXSdYi63jUhEfZqyeHJ9nQpM6Uk1TVlcKxlhl4Wl0JTFNonj0mWhqHkuAqo+SG/6UxERqaDQFBGpoNAUEamg0BQRqaDQFBGpoNAUEamg0BQRqaDQFBGpoNAUEamg0BQRqdArNM1so5ndbWaPmdlRM7vCzC4ws3vN7IlwfX7Y1szsNjNbMrNHzOzy1X0JIiJrp29N81PA1939LcBbgaPAXuCQu28DDoXbAFcD28JlD3D7RPdYRGSKOkPTzM4Dfg+4A8Ddf+nuLwA7gf1hs/3AtWF5J3CnjzwAbDSziya+5yIiU9CnpnkJ8GPgc2b2sJl9xsxeA2xy96fDNs8Am8LyZuBYdP/joUxEZO71Cc0NwOXA7e7+NuAXnGmKA+Du1b+4YmZ7zOywmR2uuZ+IyDT1Cc3jwHF3fzDcvptRiD7bNLvD9cmw/gSwNbr/llB2Fnff5+7b3X37uDsvIrLWOkPT3Z8BjpnZm0PRlcCjwEFgVyjbBRwIyweBm8Io+g7gVNSMFxGZa33P3P6nwBfM7BzgB8DNjAL3LjPbDTwFXB+2/RpwDbAEvBi2FREZBBt1R055J8ymvxMisuiO9Oku1BFBIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVFJoiIhUUmiIiFRSaIiIVOkPTzN5sZt+OLj8zsw+Z2QVmdq+ZPRGuzw/bm5ndZmZLZvaImV2++i9DRGRtdIamuz/u7pe5+2XA7wAvAl8F9gKH3H0bcCjcBrga2BYue4DbV2PHRUSmobZ5fiXwpLs/BewE9ofy/cC1YXkncKePPABsNLOLJrK3IiJTVhuaNwBfDMub3P3psPwMsCksbwaORfc5HsrOYmZ7zOywmR2u3AcRkanpHZpmdg7wPuCf03Xu7oDXPLG773P37e6+veZ+IiLTVFPTvBr4lrs/G24/2zS7w/XJUH4C2Brdb0soExGZezWheSNnmuYAB4FdYXkXcCAqvymMou8ATkXNeBGRuWajlnXHRmavAf4beKO7nwplFwJ3AW8AngKud/fnzMyATwNXMRppv9ndW/stzayqaS8isgqO9Oku7BWaq02hKSIzoFdobliLPenh58Dj096JNfY64CfT3ok1pNc7fPP+mn+rz0azEpqPL9ooupkdXqTXrNc7fIvymnXsuYhIBYWmiEiFWQnNfdPegSlYtNes1zt8C/GaZ2L0XERkXsxKTVNEZC5MPTTN7Cozezycf3Nv9z1mn5ltNbP7zexRM/uemX0wlA/6HKRmtt7MHjaze8LtS8zswfC6vhzOX4CZnRtuL4X1F09zv8dlZhvN7G4ze8zMjprZFUP+jM3sz8Pf83fN7Itm9uqhf8Y5Uw1NM1sP/D2j49ovBW40s0unuU8T8hLwEXe/FNgBfCC8rqGfg/SDwNHo9seBW939TcDzwO5Qvht4PpTfGrabR58Cvu7ubwHeyui1D/IzNrPNwJ8B2939t4H1jM56NvTPeDl3n9oFuAL4RnT7FuCWae7TKr3OA8B7GE3gvyiUXcRofirAPwA3Rtu/st28XBidmOUQ8G7gHsAYTXTekH7WwDeAK8LyhrCdTfs1VL7e84Afpvs91M+YM6d8vCB8ZvcAfzTkz7h0mXbzvNe5N+dZaJa8DXiQFZ6DdMZ9EvgocDrcvhB4wd1fCrfj1/TK6w3rT4Xt58klwI+Bz4Uuic+EczQM8jN29xPA3zE6B8XTjD6zIwz7M86admgOmpm9FvgX4EPu/rN4nY/+BQ9i6oKZvRc46e5Hpr0va2gDcDlwu7u/DfgFZ5riwOA+4/MZ/SrDJcBvAq9hdFKehTPt0BzsuTfN7FWMAvML7v6VUDzUc5C+A3ifmf0I+BKjJvqnGP3USXOobvyaXnm9Yf15wE/Xcocn4Dhw3N0fDLfvZhSiQ/2M/wD4obv/2N3/D/gKo899yJ9x1rRD8yFgWxiBO4dRx/LBKe/TioXT490BHHX3T0SrBnkOUne/xd23uPvFjD7D+9z9/cD9wHVhs/T1Nu/DdWH7uaqRufszwDEze3MouhJ4lIF+xoya5TvM7FfD33fzegf7GRdNu1MVuAb4PvAk8FfT3p8JvaZ3MmqWPQJ8O1yuYdSncwh4Avh34IKwvTGaRfAk8B1GI5RTfx1jvvZ3AfeE5TcC3wSWGP1Myrmh/NXh9lJY/8Zp7/eYr/Uy4HD4nP8VOH/InzHwMeAx4LvA54Fzh/4Z5y46IkhEpMK0m+ciInNFoSkiUkGhKSJSQaEpIlJBoSkiUkGhKSJSQaEpIlJBoSkiUuH/Ac+i+jv4RiKuAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "print inverse homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# homography visualization for tensorflow\n",
    "from numpy.linalg import inv\n",
    "print(\"homography visualization for tensorflow\")\n",
    "\n",
    "\n",
    "# sample homography\n",
    "batch_size = 10\n",
    "\n",
    "height, width = 240, 320\n",
    "shape = np.array([height, width])\n",
    "# homographies = sample_homography_batches(config, batch_size, tf=True)\n",
    "homographies = sample_homography_batches(config, batch_size, shape=shape, tf=True)\n",
    "# print(homographies)\n",
    "# change shapes\n",
    "# homographies = np.stack([scale_homography(H, image_shape, shift=(0,0)) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "print(\"print forward homographies\")\n",
    "plt.imshow(img)\n",
    "plt.show()\n",
    "\n",
    "#  inv_homography\n",
    "inv_homographies = np.stack([inv(H) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, inv_homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "    \n",
    "print(\"print inverse homographies\")\n",
    "plt.imshow(img)\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "print forward homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "print inverse homographies\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# homography visualization for tensorflow - test with my scaling homography\n",
    "from numpy.linalg import inv\n",
    "\n",
    "\n",
    "# sample homography\n",
    "batch_size = 5\n",
    "\n",
    "height, width = 240, 320\n",
    "shape = np.array([height, width])\n",
    "# homographies = sample_homography_batches(config, batch_size, tf=True)\n",
    "homographies = sample_homography_batches(config, batch_size, shape=np.array([2,2]), tf=True)\n",
    "# print(homographies)\n",
    "# change shapes\n",
    "homographies = np.stack([scale_homography(H, shape, shift=(0,0)) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "print(\"print forward homographies\")\n",
    "plt.imshow(img)\n",
    "plt.show()\n",
    "\n",
    "#  inv_homography\n",
    "inv_homographies = np.stack([inv(H) for H in homographies])\n",
    "\n",
    "# warp points\n",
    "# from utils.utils import warp_points_np\n",
    "# corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "points = warp_points_np(corner_img, inv_homographies)\n",
    "\n",
    "# plot shapes\n",
    "offset = np.array([height,width])\n",
    "img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "for i in range(points.shape[0]):\n",
    "    img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "    \n",
    "print(\"print inverse homographies\")\n",
    "plt.imshow(img)\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getHomographyPlot(config, tf=False, batch_size=10):\n",
    "    height, width = 240, 320\n",
    "    shape = np.array([height, width])\n",
    "    if tf:\n",
    "        homographies = sample_homography_batches(config, batch_size, shape=np.array([2,2]), tf=True)\n",
    "        homographies = np.stack([scale_homography(H, shape, shift=(0,0)) for H in homographies])\n",
    "    else:\n",
    "        shape = np.array([2,2])\n",
    "        homographies = sample_homography_batches(config, batch_size, shape=shape, tf=False)\n",
    "\n",
    "        # change shapes\n",
    "        height, width = 240, 320\n",
    "        image_shape = np.array([height, width])\n",
    "        homographies = np.stack([scale_homography(H, image_shape, shift=(-1,-1)) for H in homographies])\n",
    "        \n",
    "    # warp points\n",
    "#     from utils.utils import warp_points_np\n",
    "    # corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "    corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "    points = warp_points_np(corner_img, homographies)\n",
    "\n",
    "    # plot shapes\n",
    "    offset = np.array([height,width])\n",
    "    img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "    img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "    for i in range(points.shape[0]):\n",
    "        img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "    img_forward = img\n",
    "#     print(\"print forward homographies\")\n",
    "#     plt.imshow(img)\n",
    "#     plt.show()\n",
    "\n",
    "    #  inv_homography\n",
    "    inv_homographies = np.stack([inv(H) for H in homographies])\n",
    "\n",
    "    # warp points\n",
    "#     from utils.utils import warp_points_np\n",
    "    # corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "    corner_img = np.array([(0, 0), (0, height), (width, height), (width, 0)])\n",
    "    points = warp_points_np(corner_img, inv_homographies)\n",
    "\n",
    "    # plot shapes\n",
    "    offset = np.array([height,width])\n",
    "    img = np.zeros((height + offset[0]*2, width + offset[1]*2,3), np.uint8)\n",
    "    img = drawBox(corner_img, img, color=(255,0,0), offset=offset)\n",
    "    for i in range(points.shape[0]):\n",
    "        img = drawBox(points[i,:,:], img, color=(0,255,0), offset=offset)\n",
    "    img_inv = img\n",
    "    return img_forward, img_inv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compare my implementation with tensorflow implementation\n",
    "- you can play with the number\n",
    "- Left 2 columns are my implementation, right 2 cols are their implementation\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x3600 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "config = {\n",
    "    'data':{\n",
    "        'augmentation': {\n",
    "            'photometric': {\n",
    "                'enable': False,\n",
    "                'primitives': 'all',\n",
    "                'params': {},\n",
    "                'random_order': True,\n",
    "            },\n",
    "            'homographic': {\n",
    "                'enable': True,\n",
    "                'params': {\n",
    "                    'translation': True,\n",
    "                    'rotation': True,\n",
    "                    'scaling': True,\n",
    "                    'perspective': True,\n",
    "                    'scaling_amplitude': 0.2,\n",
    "                    'perspective_amplitude_x': 0.2,\n",
    "                    'perspective_amplitude_y': 0.2,\n",
    "                    'patch_ratio': 0.85,\n",
    "                    'max_angle': 1.57,\n",
    "                    'allow_artifacts': True # true\n",
    "\n",
    "                },\n",
    "                'valid_border_margin': 0,\n",
    "            },\n",
    "        }\n",
    "    }\n",
    "}\n",
    "\n",
    "config_f = {\n",
    "    'data':{\n",
    "        'augmentation': {\n",
    "            'photometric': {\n",
    "                'enable': False,\n",
    "                'primitives': 'all',\n",
    "                'params': {},\n",
    "                'random_order': True,\n",
    "            },\n",
    "            'homographic': {\n",
    "                'enable': True,\n",
    "                'params': {\n",
    "                    'translation': False,\n",
    "                    'rotation': False,\n",
    "                    'scaling': False,\n",
    "                    'perspective': False,\n",
    "                    'scaling_amplitude': 0.2,\n",
    "                    'perspective_amplitude_x': 0.2,\n",
    "                    'perspective_amplitude_y': 0.2,\n",
    "                    'patch_ratio': 0.85,\n",
    "                    'max_angle': 1.57,\n",
    "                    'allow_artifacts': True # true\n",
    "\n",
    "                },\n",
    "                'valid_border_margin': 0,\n",
    "            },\n",
    "        }\n",
    "    }\n",
    "}\n",
    "\n",
    "batch_size = 20\n",
    "\n",
    "rows = 10\n",
    "cols = 4\n",
    "scale = 5\n",
    "count = 1\n",
    "# test_warping = ['perspective', 'translation', 'rotation', 'scaling']\n",
    "test_warping = ['perspective']\n",
    "# test_warping = ['rotation']\n",
    "\n",
    "for warping in test_warping:\n",
    "    config_temp = config_f.copy()\n",
    "#     config_temp['data']['augmentation']['homographic']['params'][warping] = True\n",
    "    # config_temp['data']['augmentation']['homographic']['params']['rotation'] = True\n",
    "\n",
    "    # my warping\n",
    "    img_forward, img_inv = getHomographyPlot(config_temp, batch_size=batch_size)\n",
    "\n",
    "    plt.figure(figsize=(4*scale, 10*scale))\n",
    "    plt.subplot(rows,cols,count)\n",
    "    count += 1\n",
    "    plt.imshow(img_forward)\n",
    "    plt.title('homography: ' + warping)\n",
    "    \n",
    "    plt.subplot(rows,cols,count)\n",
    "    count += 1\n",
    "    plt.imshow(img_inv)\n",
    "    plt.title('inv homography: ' + warping)\n",
    "\n",
    "    # tf warping\n",
    "    img_forward, img_inv = getHomographyPlot(config_temp, tf=True, batch_size=batch_size)\n",
    "\n",
    "    plt.subplot(rows,cols,count)\n",
    "    count += 1\n",
    "    plt.imshow(img_forward)\n",
    "    plt.title('tf homography: ' + warping)\n",
    "    \n",
    "    plt.subplot(rows,cols,count)\n",
    "    count += 1\n",
    "    plt.imshow(img_inv)\n",
    "    plt.title('tf inv homography: ' + warping)\n",
    "    \n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  0   0]\n",
      " [  0 240]\n",
      " [320 240]\n",
      " [320   0]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "drawBox(corner_img, img, color=(0,255,0), offset=offset)\n",
    "print(corner_img)\n",
    "plt.imshow(img)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  1   5]\n",
      " [241   5]\n",
      " [241 325]\n",
      " [  1 325]]\n"
     ]
    }
   ],
   "source": [
    "corner_img = np.array([(0, 0), (height, 0), (height, width), (0, width)])\n",
    "offset = np.array([1,5])\n",
    "print(corner_img + offset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## test truncnorm\n",
    "from scipy.stats import truncnorm\n",
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots(1, 1)\n",
    "a, b = -2, 2\n",
    "loc=0\n",
    "scale=1\n",
    "x = np.linspace(truncnorm.ppf(0.01, a, b),\n",
    "                truncnorm.ppf(0.99, a, b), 100)\n",
    "ax.plot(x, truncnorm.pdf(x, a, b),\n",
    "       'r-', lw=5, alpha=0.6, label='truncnorm pdf')\n",
    "\n",
    "r = truncnorm.rvs(a, b, loc=loc, scale=scale, size=1000)\n",
    "ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)\n",
    "ax.legend(loc='best', frameon=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "angles:  [-1.57000000e+00 -1.43916667e+00 -1.30833333e+00 -1.17750000e+00\n",
      " -1.04666667e+00 -9.15833333e-01 -7.85000000e-01 -6.54166667e-01\n",
      " -5.23333333e-01 -3.92500000e-01 -2.61666667e-01 -1.30833333e-01\n",
      " -2.22044605e-16  1.30833333e-01  2.61666667e-01  3.92500000e-01\n",
      "  5.23333333e-01  6.54166667e-01  7.85000000e-01  9.15833333e-01\n",
      "  1.04666667e+00  1.17750000e+00  1.30833333e+00  1.43916667e+00\n",
      "  1.57000000e+00]\n",
      "tf angles:  Tensor(\"LinSpace_15:0\", shape=(25,), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "max_angle = 1.57\n",
    "n_angles = 25\n",
    "angles = np.linspace(-max_angle, max_angle, num=n_angles)\n",
    "print(\"angles: \", angles)\n",
    "\n",
    "import tensorflow as tf\n",
    "angles = tf.lin_space(tf.constant(-max_angle), tf.constant(max_angle), n_angles)\n",
    "print(\"tf angles: \", angles)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
